//使用stack将中缀表达式转换为后缀表达式
//这里使用程序方法
//后缀表达式，也成为逆波兰表达式，leetcode 150

#include<string>
#include<iostream>
#include<stack>
using namespace std;

//b的优先级是否高于a的优先级
bool higher (char a,char b){
    cout<<a<<b<<endl;
    if((a=='-' || a=='+') && (b=='*'|| b=='/') ){
        return true;
    }
    return false;
}

string infix2suffix(string s){
    string res="";
    stack<char> adjunct;
    for(char c : s){

        //遇到操作数，直接加入后缀表达式
        if(c>='A' &&c<='Z') res.push_back(c);
        //遇到（入栈,直到遇到），将所有数据出栈，并加入到后缀表达式
        if(c=='(') {
            adjunct.push(c);
        }
        if(c==')'){
            do//因为)之前必然有一个非括号的元素，所以第一步直接弹出没问题
            {
                auto temp=adjunct.top();adjunct.pop();
                res.push_back(temp);
            } while (adjunct.top()!='(');
            adjunct.pop();//最后弹出左括号
        }
        //遇到运算符号，如果当前运算比栈顶运算符优先级高，那么入栈
        if(c=='+'||c=='-'||c=='*'||c=='/'){
            if(adjunct.size()==0){
                cout<<adjunct.size()<<endl;
                adjunct.push(c);
            }else if(higher(c,adjunct.top())){
                adjunct.push(c);
            }else{//否则一直出栈，直到遇到
                while (higher(c,adjunct.top()))
                {
                    auto temp=adjunct.top();
                    adjunct.pop();
                    s.push_back(temp);
                }
            }
        }
        //如果比栈顶的低，那么弹出所有优先级高或者相等的运算符，
        //然后把当前运算符入栈
        //是不是很像优先队列
 
    }
       return res;

}

int main(int argc,char* argv[]){
    string s="";
    if(argc>1) s=argv[1];//将第一个参数作为字符串传入
    else{
        s="A+B*(C-D)-E/F";
    }
    auto res=infix2suffix(s);

}